home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / sound / core.h < prev    next >
C/C++ Source or Header  |  2006-01-09  |  14KB  |  447 lines

  1. #ifndef __SOUND_CORE_H
  2. #define __SOUND_CORE_H
  3.  
  4. /*
  5.  *  Main header file for the ALSA driver
  6.  *  Copyright (c) 1994-2001 by Jaroslav Kysela <perex@suse.cz>
  7.  *
  8.  *
  9.  *   This program is free software; you can redistribute it and/or modify
  10.  *   it under the terms of the GNU General Public License as published by
  11.  *   the Free Software Foundation; either version 2 of the License, or
  12.  *   (at your option) any later version.
  13.  *
  14.  *   This program is distributed in the hope that it will be useful,
  15.  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  *   GNU General Public License for more details.
  18.  *
  19.  *   You should have received a copy of the GNU General Public License
  20.  *   along with this program; if not, write to the Free Software
  21.  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  22.  *
  23.  */
  24.  
  25. #include <linux/sched.h>        /* wake_up() */
  26. #include <asm/semaphore.h>        /* struct semaphore */
  27. #include <linux/rwsem.h>        /* struct rw_semaphore */
  28. #include <linux/workqueue.h>        /* struct workqueue_struct */
  29. #include <linux/pm.h>            /* pm_message_t */
  30.  
  31. /* Typedef's */
  32. typedef struct sndrv_interval snd_interval_t;
  33. typedef enum sndrv_card_type snd_card_type;
  34. typedef struct sndrv_xferi snd_xferi_t;
  35. typedef struct sndrv_xfern snd_xfern_t;
  36. typedef struct sndrv_xferv snd_xferv_t;
  37.  
  38. /* forward declarations */
  39. #ifdef CONFIG_PCI
  40. struct pci_dev;
  41. #endif
  42. #ifdef CONFIG_SBUS
  43. struct sbus_dev;
  44. #endif
  45.  
  46. /* device allocation stuff */
  47.  
  48. #define SNDRV_DEV_TYPE_RANGE_SIZE        0x1000
  49.  
  50. typedef enum {
  51.     SNDRV_DEV_TOPLEVEL =        (0*SNDRV_DEV_TYPE_RANGE_SIZE),
  52.     SNDRV_DEV_CONTROL,
  53.     SNDRV_DEV_LOWLEVEL_PRE,
  54.     SNDRV_DEV_LOWLEVEL_NORMAL =    (1*SNDRV_DEV_TYPE_RANGE_SIZE),
  55.     SNDRV_DEV_PCM,
  56.     SNDRV_DEV_RAWMIDI,
  57.     SNDRV_DEV_TIMER,
  58.     SNDRV_DEV_SEQUENCER,
  59.     SNDRV_DEV_HWDEP,
  60.     SNDRV_DEV_INFO,
  61.     SNDRV_DEV_BUS,
  62.     SNDRV_DEV_CODEC,
  63.     SNDRV_DEV_LOWLEVEL =        (2*SNDRV_DEV_TYPE_RANGE_SIZE)
  64. } snd_device_type_t;
  65.  
  66. typedef enum {
  67.     SNDRV_DEV_BUILD,
  68.     SNDRV_DEV_REGISTERED,
  69.     SNDRV_DEV_DISCONNECTED
  70. } snd_device_state_t;
  71.  
  72. typedef enum {
  73.     SNDRV_DEV_CMD_PRE = 0,
  74.     SNDRV_DEV_CMD_NORMAL = 1,
  75.     SNDRV_DEV_CMD_POST = 2
  76. } snd_device_cmd_t;
  77.  
  78. typedef struct _snd_card snd_card_t;
  79. typedef struct _snd_device snd_device_t;
  80.  
  81. typedef int (snd_dev_free_t)(snd_device_t *device);
  82. typedef int (snd_dev_register_t)(snd_device_t *device);
  83. typedef int (snd_dev_disconnect_t)(snd_device_t *device);
  84. typedef int (snd_dev_unregister_t)(snd_device_t *device);
  85.  
  86. typedef struct {
  87.     snd_dev_free_t *dev_free;
  88.     snd_dev_register_t *dev_register;
  89.     snd_dev_disconnect_t *dev_disconnect;
  90.     snd_dev_unregister_t *dev_unregister;
  91. } snd_device_ops_t;
  92.  
  93. struct _snd_device {
  94.     struct list_head list;        /* list of registered devices */
  95.     snd_card_t *card;        /* card which holds this device */
  96.     snd_device_state_t state;    /* state of the device */
  97.     snd_device_type_t type;        /* device type */
  98.     void *device_data;        /* device structure */
  99.     snd_device_ops_t *ops;        /* operations */
  100. };
  101.  
  102. #define snd_device(n) list_entry(n, snd_device_t, list)
  103.  
  104. /* various typedefs */
  105.  
  106. typedef struct snd_info_entry snd_info_entry_t;
  107. typedef struct _snd_pcm snd_pcm_t;
  108. typedef struct _snd_pcm_str snd_pcm_str_t;
  109. typedef struct _snd_pcm_substream snd_pcm_substream_t;
  110. typedef struct _snd_mixer snd_kmixer_t;
  111. typedef struct _snd_rawmidi snd_rawmidi_t;
  112. typedef struct _snd_ctl_file snd_ctl_file_t;
  113. typedef struct _snd_kcontrol snd_kcontrol_t;
  114. typedef struct _snd_timer snd_timer_t;
  115. typedef struct _snd_timer_instance snd_timer_instance_t;
  116. typedef struct _snd_hwdep snd_hwdep_t;
  117. #if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
  118. typedef struct _snd_oss_mixer snd_mixer_oss_t;
  119. #endif
  120.  
  121. /* monitor files for graceful shutdown (hotplug) */
  122.  
  123. struct snd_monitor_file {
  124.     struct file *file;
  125.     struct snd_monitor_file *next;
  126. };
  127.  
  128. struct snd_shutdown_f_ops;    /* define it later in init.c */
  129.  
  130. /* main structure for soundcard */
  131.  
  132. struct _snd_card {
  133.     int number;            /* number of soundcard (index to
  134.                                 snd_cards) */
  135.  
  136.     char id[16];            /* id string of this card */
  137.     char driver[16];        /* driver name */
  138.     char shortname[32];        /* short name of this soundcard */
  139.     char longname[80];        /* name of this soundcard */
  140.     char mixername[80];        /* mixer name */
  141.     char components[80];        /* card components delimited with
  142.                                 space */
  143.     struct module *module;        /* top-level module */
  144.  
  145.     void *private_data;        /* private data for soundcard */
  146.     void (*private_free) (snd_card_t *card); /* callback for freeing of
  147.                                 private data */
  148.     struct list_head devices;    /* devices */
  149.  
  150.     unsigned int last_numid;    /* last used numeric ID */
  151.     struct rw_semaphore controls_rwsem;    /* controls list lock */
  152.     rwlock_t ctl_files_rwlock;    /* ctl_files list lock */
  153.     int controls_count;        /* count of all controls */
  154.     int user_ctl_count;        /* count of all user controls */
  155.     struct list_head controls;    /* all controls for this card */
  156.     struct list_head ctl_files;    /* active control files */
  157.  
  158.     snd_info_entry_t *proc_root;    /* root for soundcard specific files */
  159.     snd_info_entry_t *proc_id;    /* the card id */
  160.     struct proc_dir_entry *proc_root_link;    /* number link to real id */
  161.  
  162.     struct snd_monitor_file *files; /* all files associated to this card */
  163.     struct snd_shutdown_f_ops *s_f_ops; /* file operations in the shutdown
  164.                                 state */
  165.     spinlock_t files_lock;        /* lock the files for this card */
  166.     int shutdown;            /* this card is going down */
  167.     wait_queue_head_t shutdown_sleep;
  168.     struct work_struct free_workq;    /* for free in workqueue */
  169.     struct device *dev;
  170. #ifdef CONFIG_SND_GENERIC_DRIVER
  171.     struct snd_generic_device *generic_dev;
  172. #endif
  173.  
  174. #ifdef CONFIG_PM
  175.     int (*pm_suspend)(snd_card_t *card, pm_message_t state);
  176.     int (*pm_resume)(snd_card_t *card);
  177.     void *pm_private_data;
  178.     unsigned int power_state;    /* power state */
  179.     struct semaphore power_lock;    /* power lock */
  180.     wait_queue_head_t power_sleep;
  181. #endif
  182.  
  183. #if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
  184.     snd_mixer_oss_t *mixer_oss;
  185.     int mixer_oss_change_count;
  186. #endif
  187. };
  188.  
  189. #ifdef CONFIG_PM
  190. static inline void snd_power_lock(snd_card_t *card)
  191. {
  192.     down(&card->power_lock);
  193. }
  194.  
  195. static inline void snd_power_unlock(snd_card_t *card)
  196. {
  197.     up(&card->power_lock);
  198. }
  199.  
  200. static inline unsigned int snd_power_get_state(snd_card_t *card)
  201. {
  202.     return card->power_state;
  203. }
  204.  
  205. static inline void snd_power_change_state(snd_card_t *card, unsigned int state)
  206. {
  207.     card->power_state = state;
  208.     wake_up(&card->power_sleep);
  209. }
  210.  
  211. /* init.c */
  212. int snd_power_wait(snd_card_t *card, unsigned int power_state, struct file *file);
  213.  
  214. int snd_card_set_pm_callback(snd_card_t *card,
  215.                  int (*suspend)(snd_card_t *, pm_message_t),
  216.                  int (*resume)(snd_card_t *),
  217.                  void *private_data);
  218. int snd_card_set_generic_pm_callback(snd_card_t *card,
  219.                      int (*suspend)(snd_card_t *, pm_message_t),
  220.                      int (*resume)(snd_card_t *),
  221.                      void *private_data);
  222. #define snd_card_set_isa_pm_callback(card,suspend,resume,data) \
  223.     snd_card_set_generic_pm_callback(card, suspend, resume, data)
  224. struct pci_dev;
  225. int snd_card_pci_suspend(struct pci_dev *dev, pm_message_t state);
  226. int snd_card_pci_resume(struct pci_dev *dev);
  227. #define SND_PCI_PM_CALLBACKS \
  228.     .suspend = snd_card_pci_suspend,  .resume = snd_card_pci_resume
  229.  
  230. #else /* ! CONFIG_PM */
  231.  
  232. #define snd_power_lock(card)        do { (void)(card); } while (0)
  233. #define snd_power_unlock(card)        do { (void)(card); } while (0)
  234. static inline int snd_power_wait(snd_card_t *card, unsigned int state, struct file *file) { return 0; }
  235. #define snd_power_get_state(card)    SNDRV_CTL_POWER_D0
  236. #define snd_power_change_state(card, state)    do { (void)(card); } while (0)
  237. #define snd_card_set_pm_callback(card,suspend,resume,data)
  238. #define snd_card_set_generic_pm_callback(card,suspend,resume,data)
  239. #define snd_card_set_isa_pm_callback(card,suspend,resume,data)
  240. #define SND_PCI_PM_CALLBACKS
  241.  
  242. #endif /* CONFIG_PM */
  243.  
  244. struct _snd_minor {
  245.     struct list_head list;        /* list of all minors per card */
  246.     int number;            /* minor number */
  247.     int device;            /* device number */
  248.     const char *comment;        /* for /proc/asound/devices */
  249.     struct file_operations *f_ops;    /* file operations */
  250.     char name[0];            /* device name (keep at the end of
  251.                                 structure) */
  252. };
  253.  
  254. typedef struct _snd_minor snd_minor_t;
  255.  
  256. /* sound.c */
  257.  
  258. extern int snd_major;
  259. extern int snd_ecards_limit;
  260.  
  261. void snd_request_card(int card);
  262.  
  263. int snd_register_device(int type, snd_card_t *card, int dev, snd_minor_t *reg, const char *name);
  264. int snd_unregister_device(int type, snd_card_t *card, int dev);
  265.  
  266. #ifdef CONFIG_SND_OSSEMUL
  267. int snd_register_oss_device(int type, snd_card_t *card, int dev, snd_minor_t *reg, const char *name);
  268. int snd_unregister_oss_device(int type, snd_card_t *card, int dev);
  269. #endif
  270.  
  271. int snd_minor_info_init(void);
  272. int snd_minor_info_done(void);
  273.  
  274. /* sound_oss.c */
  275.  
  276. #ifdef CONFIG_SND_OSSEMUL
  277. int snd_minor_info_oss_init(void);
  278. int snd_minor_info_oss_done(void);
  279. int snd_oss_init_module(void);
  280. #else
  281. #define snd_minor_info_oss_init() /*NOP*/
  282. #define snd_minor_info_oss_done() /*NOP*/
  283. #define snd_oss_init_module() 0
  284. #endif
  285.  
  286. /* memory.c */
  287.  
  288. int copy_to_user_fromio(void __user *dst, const volatile void __iomem *src, size_t count);
  289. int copy_from_user_toio(volatile void __iomem *dst, const void __user *src, size_t count);
  290.  
  291. /* init.c */
  292.  
  293. extern unsigned int snd_cards_lock;
  294. extern snd_card_t *snd_cards[SNDRV_CARDS];
  295. extern rwlock_t snd_card_rwlock;
  296. #if defined(CONFIG_SND_MIXER_OSS) || defined(CONFIG_SND_MIXER_OSS_MODULE)
  297. #define SND_MIXER_OSS_NOTIFY_REGISTER    0
  298. #define SND_MIXER_OSS_NOTIFY_DISCONNECT    1
  299. #define SND_MIXER_OSS_NOTIFY_FREE    2
  300. extern int (*snd_mixer_oss_notify_callback)(snd_card_t *card, int cmd);
  301. #endif
  302.  
  303. snd_card_t *snd_card_new(int idx, const char *id,
  304.              struct module *module, int extra_size);
  305. int snd_card_disconnect(snd_card_t *card);
  306. int snd_card_free(snd_card_t *card);
  307. int snd_card_free_in_thread(snd_card_t *card);
  308. int snd_card_register(snd_card_t *card);
  309. int snd_card_info_init(void);
  310. int snd_card_info_done(void);
  311. int snd_component_add(snd_card_t *card, const char *component);
  312. int snd_card_file_add(snd_card_t *card, struct file *file);
  313. int snd_card_file_remove(snd_card_t *card, struct file *file);
  314.  
  315. #ifndef snd_card_set_dev
  316. #define snd_card_set_dev(card,devptr) ((card)->dev = (devptr))
  317. #endif
  318. /* register a generic device (for ISA, etc) */
  319. int snd_card_set_generic_dev(snd_card_t *card);
  320.  
  321. /* device.c */
  322.  
  323. int snd_device_new(snd_card_t *card, snd_device_type_t type,
  324.            void *device_data, snd_device_ops_t *ops);
  325. int snd_device_register(snd_card_t *card, void *device_data);
  326. int snd_device_register_all(snd_card_t *card);
  327. int snd_device_disconnect(snd_card_t *card, void *device_data);
  328. int snd_device_disconnect_all(snd_card_t *card);
  329. int snd_device_free(snd_card_t *card, void *device_data);
  330. int snd_device_free_all(snd_card_t *card, snd_device_cmd_t cmd);
  331.  
  332. /* isadma.c */
  333.  
  334. #ifdef CONFIG_ISA_DMA_API
  335. #define DMA_MODE_NO_ENABLE    0x0100
  336.  
  337. void snd_dma_program(unsigned long dma, unsigned long addr, unsigned int size, unsigned short mode);
  338. void snd_dma_disable(unsigned long dma);
  339. unsigned int snd_dma_pointer(unsigned long dma, unsigned int size);
  340. #endif
  341.  
  342. /* misc.c */
  343. struct resource;
  344. void release_and_free_resource(struct resource *res);
  345.  
  346. #ifdef CONFIG_SND_VERBOSE_PRINTK
  347. void snd_verbose_printk(const char *file, int line, const char *format, ...)
  348.      __attribute__ ((format (printf, 3, 4)));
  349. #endif
  350. #if defined(CONFIG_SND_DEBUG) && defined(CONFIG_SND_VERBOSE_PRINTK)
  351. void snd_verbose_printd(const char *file, int line, const char *format, ...)
  352.      __attribute__ ((format (printf, 3, 4)));
  353. #endif
  354.  
  355. /* --- */
  356.  
  357. #ifdef CONFIG_SND_VERBOSE_PRINTK
  358. /**
  359.  * snd_printk - printk wrapper
  360.  * @fmt: format string
  361.  *
  362.  * Works like print() but prints the file and the line of the caller
  363.  * when configured with CONFIG_SND_VERBOSE_PRINTK.
  364.  */
  365. #define snd_printk(fmt, args...) \
  366.     snd_verbose_printk(__FILE__, __LINE__, fmt ,##args)
  367. #else
  368. #define snd_printk(fmt, args...) \
  369.     printk(fmt ,##args)
  370. #endif
  371.  
  372. #ifdef CONFIG_SND_DEBUG
  373.  
  374. #define __ASTRING__(x) #x
  375.  
  376. #ifdef CONFIG_SND_VERBOSE_PRINTK
  377. /**
  378.  * snd_printd - debug printk
  379.  * @format: format string
  380.  *
  381.  * Compiled only when Works like snd_printk() for debugging purpose.
  382.  * Ignored when CONFIG_SND_DEBUG is not set.
  383.  */
  384. #define snd_printd(fmt, args...) \
  385.     snd_verbose_printd(__FILE__, __LINE__, fmt ,##args)
  386. #else
  387. #define snd_printd(fmt, args...) \
  388.     printk(fmt ,##args)
  389. #endif
  390. /**
  391.  * snd_assert - run-time assertion macro
  392.  * @expr: expression
  393.  * @args...: the action
  394.  *
  395.  * This macro checks the expression in run-time and invokes the commands
  396.  * given in the rest arguments if the assertion is failed.
  397.  * When CONFIG_SND_DEBUG is not set, the expression is executed but
  398.  * not checked.
  399.  */
  400. #define snd_assert(expr, args...) do {                    \
  401.     if (unlikely(!(expr))) {                    \
  402.         snd_printk(KERN_ERR "BUG? (%s)\n", __ASTRING__(expr));    \
  403.         dump_stack();                        \
  404.         args;                            \
  405.     }                                \
  406. } while (0)
  407.  
  408. #define snd_BUG() do {                \
  409.     snd_printk(KERN_ERR "BUG?\n");        \
  410.     dump_stack();                \
  411. } while (0)
  412.  
  413. #else /* !CONFIG_SND_DEBUG */
  414.  
  415. #define snd_printd(fmt, args...)    /* nothing */
  416. #define snd_assert(expr, args...)    (void)(expr)
  417. #define snd_BUG()            /* nothing */
  418.  
  419. #endif /* CONFIG_SND_DEBUG */
  420.  
  421. #ifdef CONFIG_SND_DEBUG_DETECT
  422. /**
  423.  * snd_printdd - debug printk
  424.  * @format: format string
  425.  *
  426.  * Compiled only when Works like snd_printk() for debugging purpose.
  427.  * Ignored when CONFIG_SND_DEBUG_DETECT is not set.
  428.  */
  429. #define snd_printdd(format, args...) snd_printk(format, ##args)
  430. #else
  431. #define snd_printdd(format, args...) /* nothing */
  432. #endif
  433.  
  434.  
  435. #define SNDRV_OSS_VERSION         ((3<<16)|(8<<8)|(1<<4)|(0))    /* 3.8.1a */
  436.  
  437. /* for easier backward-porting */
  438. #if defined(CONFIG_GAMEPORT) || defined(CONFIG_GAMEPORT_MODULE)
  439. #ifndef gameport_set_dev_parent
  440. #define gameport_set_dev_parent(gp,xdev) ((gp)->dev.parent = (xdev))
  441. #define gameport_set_port_data(gp,r) ((gp)->port_data = (r))
  442. #define gameport_get_port_data(gp) (gp)->port_data
  443. #endif
  444. #endif
  445.  
  446. #endif /* __SOUND_CORE_H */
  447.